package cn.lanqiao.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.concurrent.ConcurrentHashMap;

@Component
@Aspect//表明这是一个切面类
public class Advice {
    /**
     * 抽取出来的切入点表达式
     */
    @Pointcut("execution(* cn.lanqiao.aop.*.*(..))")
    public void myPoint(){

    }

    /**
     * 前置增强方法
     */
    @Before("Advice.myPoint()") //前置通知 及其 切入点表达式
    public void before(){
        System.out.println("前置代码增强...");
    }

    /**
     * 后置通知
     * @param res
     */
    @AfterReturning(value = "Advice.myPoint()", returning = "res")
    public void afterReturn(Object res){
        System.out.println("后置通知..." + res);
    }

    /**
     * 最终通知
     */
    @After("Advice.myPoint()")
    public void after(){
        System.out.println("最终代码增强...");
    }

    /**
     * 环绕通知
     */
    @Around("Advice.myPoint()")
    public void around(ProceedingJoinPoint point) throws Throwable {
        // 在目标方法执行之前的相应处理
        System.out.println("删除之前...");
        // 调用执行 目标方法
        Object res = point.proceed();
        // 目标方法执行之后的处理
        System.out.println("删除之后");
    }

    /**
     * 异常通知
     */
    public void exct(Exception e){
        System.out.println(e);
    }
}